/**
 * @file   : init.h
 * @author : chenshucheng
 * @date   : 03/24/2021
 * @brief  : 测试框架
 * @note   : 
 */

#ifndef __INIT_H__
#define __INIT_H__

#include <pthread.h>
#include "base_type.h"
#include "CUnit.h"

enum {
    INACTIVE = 0,
    ACTIVE,
};
#define UTITENUM   (500)        ///< 套件最大数量
#define FWT_UT_RUNLOOP       (1)      ///< 测试运行测轮数

enum {
    FWT_UT_RUN_INACTIVE = 0,
    FWT_UT_RUN_ALL_SUITE = 1,
    FWT_UT_RUN_SIGNAL_SUITE = 2,
};

typedef struct FwtCunitCfg{
    U16  flag;       ///< 运行标记
    U16  runLoop;    ///< 运行轮数
    S8 *pCunitName;  ///< 运行测试用例名称
}FwtCunitCfg_s;

/**
 * @brief   开始打桩，执行fwtStubCreate前需要调用
 * @param:  [in]   void **cookie void类型指针的地址，恢复调用时用到
 * @return  [out]  无
 * @warning 可重入
 * @note    新生成函数
 */
void fwtStubBegin(void **cookie);

/**
 * @brief   创建桩，进行调用替换
 * @param:  [in]   void *func 原函数指针
 * @param:  [in]   void *stub 桩函数指针
 * @param:  [in]   void *cookie 用以恢复调用的指针
 * @return  [out]  无
 * @warning 可重入
 * @note    新生成函数
 */
S32 fwtStubCreate(void *func, void *stub, void *cookie);

/**
 * @brief   除掉桩，恢复调用
 * @param:  [in]   void *func 原函数指针
 * @param:  [in]   void *cookie 用以恢复调用的指针
 * @return  [out]  无
 * @warning 可重入
 * @note    新生成函数
 */
S32 fwtStubDestroy(void *func, void *cookie);

/**
 * @brief   utStubDestroy之后调用，结束打桩
 * @param:  [in]   void *cookie 用以恢复调用的指针
 * @return  [out]  无
 * @warning 可重入
 * @note    新生成函数
 */
void fwtStubEnd(void *cookie);

#define UITEINIT(function)                                           \
static void  __attribute__((constructor))  utInit ## function (void)  \
{                                                                     \
    function();                                                       \
}

void fwtInitSuite(CU_SuiteInfo SUTSuites[]);

#endif


